package com.salmon.common.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;

import java.nio.charset.StandardCharsets;
import java.security.PublicKey;

/**
 * JWT 解析工具
 */
public class JwtHelper {

    private static Jws<Claims> parserToken(String jwtToken, byte[] key) {
        return Jwts.parser().setSigningKey(key).parseClaimsJws(jwtToken);
    }

    /**
     * 对称加密token的解析
     * @param token JWT token
     * @param signature 生成jwtToken的秘钥字符串 对称加密的 key
     * @return
     */
    public static Claims parserToken(String token, String signature) {
        return parserToken(token,signature.getBytes(StandardCharsets.UTF_8)).getBody();
    }


    /**
     * 私钥加密token
     * <p>
     *   String token = JwtUtils.generateToken(userInfo, jwtProperties.getPrivateKey(), jwtProperties.getExpire());
     * </p>
     *
     * @param userInfo      载荷中的数据
     * @param privateKey    私钥
     * @param expireMinutes 过期时间，单位秒
     * @return
     * @throws Exception
     */
/*    public static String generateToken(UserInfo userInfo, PrivateKey privateKey, int expireMinutes) throws Exception {
        return Jwts.builder()
                .claim(JWT_KEY_ID, userInfo.getId())
                .claim(JWT_KEY_USER_NAME, userInfo.getUsername())
                .setExpiration(DateTime.now().plusMinutes(expireMinutes).toDate())
                .signWith(SignatureAlgorithm.RS256, privateKey)
                .compact();
    }*/

    /**
     * 私钥加密token
     *
     * @param userInfo      载荷中的数据
     * @param privateKey    私钥字节数组
     * @param expireMinutes 过期时间，单位秒
     * @return
     * @throws Exception
     */
/*
    public static String generateToken(UserInfo userInfo, byte[] privateKey, int expireMinutes) throws Exception {
        return Jwts.builder()
                .claim(JWT_KEY_ID, userInfo.getId())
                .claim(JWT_KEY_USER_NAME, userInfo.getUsername())
                .setExpiration(DateTime.now().plusMinutes(expireMinutes).toDate())
                .signWith(SignatureAlgorithm.RS256, RsaUtils.getPrivateKey(privateKey))
                .compact();
    }
*/

    /**
     * 公钥解析token
     *
     * @param token     用户请求中的jwt token
     * @param publicKey 公钥
     * @return
     * @throws Exception
     */
    private static Jws<Claims> parserTokenFromPublicKey(String token, PublicKey publicKey) {
        return Jwts.parser().setSigningKey(publicKey).parseClaimsJws(token);
    }

    /**
     * 公钥解析token
     *
     * @param token     用户请求中的 jwt token
     * @param publicKey 公钥字节数组
     * @return
     * @throws Exception
     */
    private static Jws<Claims> parserTokenFromPublicKey(String token, byte[] publicKey) throws Exception {
        return Jwts.parser().setSigningKey(RsaUtils.getPublicKey(publicKey))
                .parseClaimsJws(token);
    }
}
